import functools
import logging
import time
import inspect


# 配置日志系统
def setup_logging(log_file=r"D:\Gitee\temperature_detection_api_auto\app.log", log_level=logging.INFO):
    """配置日志系统"""
    # 创建 logger
    logger = logging.getLogger(__name__)
    logger.setLevel(log_level)
    
    # 清除之前的处理器
    logger.handlers.clear()
    
    # 创建文件处理器
    file_handler = logging.FileHandler(log_file, encoding='utf-8')
    file_handler.setLevel(log_level)
    
    # 创建控制台处理器（可选）
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.WARNING)  # 控制台只显示警告和错误
    
    # 创建格式化器
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    file_handler.setFormatter(formatter)
    console_handler.setFormatter(formatter)
    
    # 添加处理器到 logger
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    return logger

# 初始化日志
logger = setup_logging()

def log_decorator(func,id=0,message=''):
    """使用 logging 库的日志装饰器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 获取函数信息
        func_file = inspect.getfile(func)
        func_line = inspect.getsourcelines(func)[1]
        func_module = func.__module__
        # 记录函数开始执行
        logger.info(f"开始执行函数: {func.__name__}")
        logger.debug(f"函数位置: {func_file}:{func_line}")
        logger.debug(f"模块路径: {func_module}")
        if args:
            logger.debug(f"位置参数: {args}")
        if kwargs:
            logger.debug(f"关键字参数: {kwargs}")
        start_time = time.time()
        try:
            # 执行函数
            result = func(*args, **kwargs)
            execution_time = time.time() - start_time
            # 记录成功信息
            logger.info(f"函数执行成功: {func.__name__}")
            logger.info(f"执行时间: {execution_time:.4f}秒")
            if result is not None:
                logger.debug(f"返回值: {result}")
            return result
        except Exception as e:
            execution_time = time.time() - start_time
            # 记录错误信息
            logger.error(f"函数执行失败: {func.__name__}")
            logger.error(f"执行时间: {execution_time:.4f}秒")
            logger.error(f"错误类型: {type(e).__name__}")
            logger.error(f"错误信息: {e}")
            logger.error(f"错误位置: {func_file}:{func_line}")
            # 重新抛出异常
            raise
        finally:
            # 记录函数执行完成
            logger.info(f"函数执行完成: {func.__name__}")
            logger.info("=" * 50)
    return wrapper


# 工具函数
def change_log_level(level):
    """更改日志级别"""
    logger.setLevel(level)
    for handler in logger.handlers:
        handler.setLevel(level)

def change_log_file(filename):
    """更改日志文件"""
    # 移除旧的文件处理器
    for handler in logger.handlers[:]:
        if isinstance(handler, logging.FileHandler):
            logger.removeHandler(handler)
            handler.close()
    
    # 添加新的文件处理器
    file_handler = logging.FileHandler(filename, encoding='utf-8')
    file_handler.setLevel(logger.level)
    
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    file_handler.setFormatter(formatter)
    
    logger.addHandler(file_handler)

def logstart_page(testsname):
    """
    开始执行
    """
    logger.info('*'*30 + f"开始测试 【{testsname}】 接口" + '*'*30)
    logger.info('*'*80 )
    
def logs_info(message):
    logger.info(message)

def logs_error(message):
    logger.error(message)

def logs_debug(message):
    logger.debug(message)

def log_all_methods(cls):
    """为类中所有测试方法添加log_decorator"""
    for name, method in cls.__dict__.items():
        if name.startswith('test_') and callable(method):
            setattr(cls, name, log_decorator(method))
    return cls
